package com.fsm.common.drools.config;

import jakarta.annotation.PostConstruct;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 这个类用于配置Drools规则引擎，使我们的应用能够使用预定义的业务规则。
 * Drools是一个强大的规则引擎，可以帮助我们更灵活地管理业务逻辑。
 */
@Configuration
public class DroolsConfig {

    // 创建一个静态的KieServices实例，它是访问所有Drools服务的主要入口点。
    private static final KieServices kieServices = KieServices.Factory.get();

    // 定义规则文件的位置。这里使用的是一个名为"order.drl"的规则文件，它位于类路径下的"src/main/resources"目录中。
//    private static final String RULES_CUSTOMER_RULES_DRL = "";
    @Value("${droolsPath}")
    private String droolsPath;

    /**
     * 创建并返回一个KieContainer对象，它是规则引擎的核心组件之一。
     * KieContainer负责加载和管理所有的规则、流程等资源。
     *
     * @return 返回配置好的KieContainer对象。
     */
    @Bean
    public KieContainer kieContainer() {
        // 创建一个新的KieFileSystem对象，用来模拟文件系统，方便我们添加规则文件。
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();

        // 将规则文件加载到KieFileSystem中。这里使用的是类路径资源加载方式。
        kieFileSystem.write(ResourceFactory.newFileResource(droolsPath));

        // 创建一个KieBuilder对象，用于编译KieFileSystem中的资源（即规则文件）。
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);

        // 编译所有资源。如果规则文件中有错误，这一步会抛出异常。
        kieBuilder.buildAll();

        // 获取编译后的模块。KieModule是包含已编译规则和其他资源的包。
        KieModule kieModule = kieBuilder.getKieModule();

        // 使用编译后的模块创建一个KieContainer。KieContainer是运行时环境，可以在其中创建会话并执行规则。
        KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());

        // 最后，返回配置好的KieContainer对象，以便其他地方可以使用它。
        return kieContainer;
    }

}

